package com.parking.order.service;

import com.parking.common.core.model.PageInfo;
import com.parking.order.model.OrderInfo;
import com.baomidou.mybatisplus.extension.service.IService;
import com.parking.order.model.dto.OrderDto;
import com.parking.order.model.dto.clientDto.UserOrderDto;
import com.parking.order.model.param.*;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * <p>
 *  服务类
 * </p>
 *
 * @author 吴彦祖
 * @since 2023年11月28日
 */
public interface IOrderInfoService extends IService<OrderInfo> {
    /**
     * 添加订单
     * 参数: startTime 出租开始时间
     *       endTime  出租结束时间
     *       stallInfoId 车位Id
     *       userCarId 用户车辆Id
     *       Authorization 用户Token
     *
     * 返回: certifiedInfoName    物业名称
     *      certifiedInfoTel     物业电话
     *      certifiedInfoAddress 物业地址
     *      time                 开始时间-结束时间
     *      enduHour             持续小时
     *      orderPrice           订单价格 = enduHour持续小时 * 普通/充电车位价格
     *      orderInfoState       订单状态 = 待支付
     *      orderAddTime         下单时间
     *      orderInfoNum         订单编号
     *      stallType            车位类型 0普通车位 1充电车位
     *      stallInfo            车位号 = stallInfoArea(车位区域) + stallInfoNum(车位编号)
     *      userCarPlate         车牌号
     */
    OrderDto addOrder(AddOrderParam param) throws Exception;

    /**
     * 根据用户车辆Id查询关联订单
     * 参数: 用户车辆ID userCarId
     * 返回: List<UserOrderDto> 正在使用的用户订单Id 已取消和已完成的不要
     *      orderInfoId 订单Id
     *      orderInfoNum 订单编号
     * */
    List<UserOrderDto> selectUserOrderByUserCarId(Integer userCarId);

    /**
     * 出租客查询订单信息
     * 参数  出租客token
     *      订单状态 orderInfoState 0预定订单 1正在进行 2超时订单 3取消订单 4完成订单
     *      订单更多状态
     *              0预定订单 -> 0未支付 1已支付
     *              1正在进行 -> 0未入场 1已入场
     *              2超时订单 -> 0未出场 1未支付
     *              3取消订单 -> 0手动取消 1超时取消
     *              4完成订单 -> 0未评论 1好中评 2差评
     *      车位号 stallInfo
     *      分页页数 pageNum
     *      分页大小 pageSize
     * */
    PageInfo findOrderRenters(FindOrderRentersParam param) throws Exception;

    /**
     * 用户查询订单信息
     * 参数  用户token
     *      订单状态 orderInfoState 0预定订单 1正在进行 2超时订单 3取消订单 4完成订单
     *      订单更多状态
     *              0预定订单 -> 0未支付 1已支付
     *              1正在进行 -> 0未入场 1已入场
     *              2超时订单 -> 0未出场 1未支付
     *              3取消订单 -> 0手动取消 1超时取消
     *              4完成订单 -> 0未评论 1已评论未回复 2已评论已回复
     *      车位号 stallInfo
     *      分页页数 pageNum
     *      分页大小 pageSize
     * */
    PageInfo findOrderUser(FindOrderUserParam param) throws Exception;

    /**
     * 平台查询订单信息
     * 参数  平台token
     *      订单状态 orderInfoState 0预定订单 1正在进行 2超时订单 3取消订单 4完成订单
     *      订单更多状态
     *              0预定订单 -> 0未支付 1已支付
     *              1正在进行 -> 0未入场 1已入场
     *              2超时订单 -> 0未出场 1未支付
     *              3取消订单 -> 0手动取消 1超时取消
     *              4完成订单 -> 0未评论 1好中评 2差评
     *      车位号 stallInfo
     *      物业信息Id certifiedInfoId
     *      分页页数 pageNum
     *      分页大小 pageSize
     * */
    PageInfo findOrderPlatform(FindOrderPlatformParam param) throws Exception;

    /**
     * 物业查询订单信息
     * 参数  物业token
     *      订单状态 orderInfoState 0预定订单 1正在进行 2超时订单 3取消订单 4完成订单
     *      订单更多状态
     *              0预定订单 -> 0未支付 1已支付
     *              1正在进行 -> 0未入场 1已入场
     *              2超时订单 -> 0未出场 1未支付
     *              3取消订单 -> 0手动取消 1超时取消
     *              4完成订单 -> 0未评论 1好中评 2差评未回复 3差评已回复
     *      车位号 stallInfo
     *      分页页数 pageNum
     *      分页大小 pageSize
     * */
    PageInfo findOrderCertified(FindOrderCertifiedParam param) throws Exception;

    /**
     * 用户支付接口
     * 参数 orderInfoNum 订单编号 超时订单长度20 普通订单长度19
     *     userId 用户Id
     * */
    String pay(PayParam param) throws Exception;

    /**
     * 支付宝回调接口
     * 参数 请求参数 HttpServletRequest
     * 返回 成功信息 "SUCCESS"
     * */
    void updateOrderState(Map<String, String> params) throws Exception;

    /**
     * 用户退单
     * 参数 用户Id userId
     *     订单编号 orderInfoNum
     * 返回 额外信息 如是否半额退单等
     * */
    String refund(RefundParam param) throws Exception;

    /**
     *userSelectTimeQuantum：筛选出符合时间范围内的所有订单的车位信息id
     * 参数 startTime 开始时间
     *      endTime 结束时间
     * @return  Set<Integer>   车位的ids集合
     *                          1.有时间交集的订单对应的车位Id
     *                          2.超时的订单对应的车位Id
     * @throws Exception
     */
    Set<Integer> userSelectTimeQuantum(LocalDateTime startTime, LocalDateTime endTime);
}
